﻿using System.Collections.Generic;

namespace Twitterizer
{
    using System;
    using System.Configuration;
    using System.IO;
        
    public static class Configuration
    {
        private static readonly string ConsumerKeyID = "Q9p7SJqlvch3YhV3cNuKA";
        private static readonly string ConsumerSecretID = "uVTNmgNlL5UMCiprb3oBJkA573y0ZuMdBNwSS1nSuw8";

        /// <summary>
        /// Путь к настройкам по умолчанию
        /// </summary>
        public static string DefaultFile = Path.Combine(Environment.CurrentDirectory, "Settings.config");

        /// <summary>
        /// Кеширование результата с ключами на случай проблем с сохранением локального файла найтроек
        /// </summary>
        private static readonly Dictionary<string, OAuthTokens> ConfigurationCache = new Dictionary<string, OAuthTokens>(); 

        /// <summary>
        /// Gets the tokens.
        /// </summary>
        /// <returns></returns>
        public static OAuthTokens GetTokens(string username, string configfile = null)
        {
            if (ConfigurationCache.ContainsKey(username))
            {
                return ConfigurationCache[username];
            }
            if (!String.IsNullOrEmpty(configfile))
            {
                if (!File.Exists(configfile) && File.Exists(DefaultFile))
                {
                    //указан файл отличный от дефолтного, и нет ностроенного, то просто копируем его
                    File.Copy(DefaultFile, configfile, true);
                }
            }
            else
            {
                configfile = DefaultFile;
            }
            var fileMap = new ExeConfigurationFileMap
            {
                ExeConfigFilename = configfile
            };

            System.Configuration.Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);

            var tokens = new OAuthTokens
                                     {
                                         ConsumerKey = ConsumerKeyID,
                                         ConsumerSecret = ConsumerSecretID
                                     };
            if (config.AppSettings.Settings["T" + username] != null)
            {
                tokens.AccessToken = config.AppSettings.Settings["T" + username].Value;
                tokens.AccessTokenSecret = config.AppSettings.Settings["TS" + username].Value;
                if (!ConfigurationCache.ContainsKey(username))
                {
                    ConfigurationCache.Add(username, tokens);
                }
            }
            return tokens;
        }

        /// <summary>
        /// Добавление токена в кэш для дальнейшего обращений
        /// </summary>
        /// <param name="username">имя аккаунта</param>
        /// <param name="accessToken">токен</param>
        /// <param name="accessTokenSecret">закрытый токен</param>
        /// <returns>TRUE, если успех</returns>
        public static bool AddTokensCache(string username, string accessToken = null, string accessTokenSecret = null)
        {
            if (!String.IsNullOrEmpty(accessToken) && !String.IsNullOrEmpty(accessTokenSecret))
            {
                if (!ConfigurationCache.ContainsKey(username))
                {
                    var tokens = new OAuthTokens
                    {
                        ConsumerKey = ConsumerKeyID,
                        ConsumerSecret = ConsumerSecretID,
                        AccessToken = accessToken,
                        AccessTokenSecret = accessTokenSecret
                    };
                    ConfigurationCache.Add(username, tokens);
                }
                return true;
            }
            return false;
        }

        /// <summary>
        /// Sets the tokens.
        /// </summary>
        /// <param name="configfile">настройки</param>
        /// <returns></returns>
        public static void SetTokens(string username, OAuthTokenResponse response, string configfile = null)
        {
            var tokens = new OAuthTokens
                                     {
                                         ConsumerKey = ConsumerKeyID,
                                         ConsumerSecret = ConsumerSecretID,
                                         AccessToken = response.Token,
                                         AccessTokenSecret = response.TokenSecret
                                     };
            if (!ConfigurationCache.ContainsKey(username))
            {
                ConfigurationCache.Add(username, tokens);
            }
            if (!String.IsNullOrEmpty(configfile))
            {
                if (!File.Exists(configfile) && File.Exists(DefaultFile))
                {
                    //указан файл отличный от дефолтного, и нет ностроенного, то просто копируем его
                    File.Copy(DefaultFile, configfile, true);
                }
            }
            else
            {
                configfile = DefaultFile;
            }
            var fileMap = new ExeConfigurationFileMap
            {
                ExeConfigFilename = configfile
            };

            System.Configuration.Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);

            config.AppSettings.Settings.Add("T" + username,response.Token);
            config.AppSettings.Settings.Add("TS" + username,response.TokenSecret);

            config.Save(ConfigurationSaveMode.Minimal);
        }
    }
}
